package com.kevin.util.properties;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.TimeUnit;

import org.apache.commons.configuration2.YAMLConfiguration;
import org.apache.commons.configuration2.builder.ReloadingFileBasedConfigurationBuilder;
import org.apache.commons.configuration2.builder.fluent.FileBasedBuilderParameters;
import org.apache.commons.configuration2.builder.fluent.Parameters;
import org.apache.commons.configuration2.ex.ConfigurationException;
import org.apache.commons.configuration2.reloading.PeriodicReloadingTrigger;

import lombok.extern.slf4j.Slf4j;

/**
 * Yaml格式参数管理工具
 * 
 * @ClassName SysconfigAction
 * @author <a href="mailto:donggongai@126.com" target="_blank">kevin</a>
 * @date 2014-6-21 下午2:37:40
 * 
 */
@Slf4j
public class YamlUtil {
    private ReloadingFileBasedConfigurationBuilder<YAMLConfiguration> reloadbuilder = null;

    /**
     * 
     * @Title 构造函数（不公开） <br>
     * @author 吕凯 <br>
     * @date 2017年12月20日 下午5:33:29 <br>
     * @param fileName
     *            <br>
     * @param delimiterParsingDisabled
     *            分隔符是否可用<br>
     * @param listDelimiter
     *            分隔符<br>
     */
    public YamlUtil(String fileName) {
        try {
            Parameters params = new Parameters();
            FileBasedBuilderParameters parameters = params.fileBased().setFileName(fileName);
            reloadbuilder = new ReloadingFileBasedConfigurationBuilder<YAMLConfiguration>(YAMLConfiguration.class).configure(parameters);
            reloadbuilder.setAutoSave(true);
            PeriodicReloadingTrigger trigger = new PeriodicReloadingTrigger(reloadbuilder.getReloadingController(), null, 1,
                    TimeUnit.SECONDS);

            trigger.start();

        } catch (Exception e) {
            log.error("获取系统属性出错！", e);
        }
    }

    private YAMLConfiguration getConfig() {
        YAMLConfiguration configuration = null;
        try {
            configuration = reloadbuilder.getConfiguration();
        } catch (ConfigurationException e) {
            e.printStackTrace();
        }
        return configuration;
    }

    /**
     * 获取所有的属性(暂不支持)
     * 
     * @Title getPropertyKeys
     * @author 吕凯
     * @date 2016年11月1日 下午3:55:58
     * @return Set<String>
     */
    public List<PropertiesPojo> getPropertys() {
        Iterator<String> keys = getConfig().getKeys();
        List<PropertiesPojo> configList = new ArrayList<>();
        while (keys.hasNext()) {
//            String key = keys.next();
//            PropertiesPojo configModel = new PropertiesPojo();
//            configModel.setKey(key);
//            ;
//            configModel.setValue(getConfig().getString(key));
//            String comment = getConfig().getLa.getComment(key);
//            if (comment != null) {
//                try {
//                    comment = new String(comment.getBytes("iso-8859-1"));
//                } catch (UnsupportedEncodingException e) {
//                    log.error("编码异常", e);
//                }
//                comment = comment.replace("#", "");
//            }
//            configModel.setComment(comment);
//            configList.add(configModel);
        }
        return configList;
    }

    /**
     * 获取所有key
     * 
     * @Title getKeys
     * @author 吕凯
     * @date 2017年12月20日 下午5:52:11
     * @return List<String>
     */
    public List<String> getKeys() {
        Iterator<String> keys = getConfig().getKeys();
        List<String> configList = new ArrayList<>();
        while (keys.hasNext()) {
            String key = keys.next();
            configList.add(key);
        }
        return configList;
    }

    /**
     * 根据前缀获取Properties对象
     * 
     * @Title getProperties
     * @author 吕凯
     * @date 2016年11月1日 下午3:56:17
     * @param prefix
     * @return Properties
     */
    public Properties getProperties(String prefix) {
        Properties properties = new Properties();
        Iterator<String> keys = getConfig().getKeys(prefix);
        while (keys.hasNext()) {
            String key = keys.next();
            properties.put(key, getConfig().getProperty(key));
        }
        return properties;
    }

    public String getString(String key) {
        return getString(key, "");
    }

    public List<Object> getList(String key) {
        return getConfig().getList(key);
    }

    /**
     * 返回属性值
     */
    public String getString(String key, String defaultValue) {
        return getConfig().getString(key, defaultValue);
    }

    public int getInt(String key, int defaultValue) {
        return getConfig().getInt(key, defaultValue);
    }

    public boolean getBoolean(String key, boolean defaultValue) {
        return getConfig().getBoolean(key, defaultValue);
    }

    public long getLong(String key, long defaultValue) {
        return getConfig().getLong(key, defaultValue);
    }

    public double getDouble(String key, double defaultValue) {
        return getConfig().getDouble(key, defaultValue);
    }

    /**
     * 写入properties信息
     */
    public void save(String key, String value) {
        try {
            getConfig().setProperty(key, value);
            reloadbuilder.save();
//            config.refresh(); // 刷新保证顺序不变
            saveCallback(key, value);
        } catch (ConfigurationException e) {
            log.error("保存失败", e);
        }
    }

    /**
     * 写入properties信息
     */
    public void save(Map<String, Object> proMap) {
        if (proMap == null || proMap.isEmpty()) {
            return;
        }
        for (String key : proMap.keySet()) {
            getConfig().setProperty(key, proMap.get(key));
        }
        try {
            reloadbuilder.save();
//            config.refresh(); // 刷新保证顺序不变
            saveCallback(proMap);
        } catch (ConfigurationException e) {
            log.error("保存失败", e);
        }
    }

    /**
     * 
     * 保存成功的回调函数
     * 
     * @Title saveCallback
     * @author 吕凯
     * @date 2017年12月20日 下午6:01:40 void
     */
    public void saveCallback(String key, String value) {

    }

    /**
     * 
     * 保存成功的回调函数
     * 
     * @Title saveCallback
     * @author 吕凯
     * @date 2017年12月20日 下午6:01:40 void
     */
    public void saveCallback(Map<String, Object> proMap) {

    }
}
